const Joi = require('joi')

// 部门验证规则
exports.validateDepartment = (data) => {
  const schema = Joi.object({
    name: Joi.string().min(2).max(50).required()
      .messages({
        'string.base': '部门名称必须是字符串',
        'string.empty': '部门名称不能为空',
        'string.min': '部门名称至少需要2个字符',
        'string.max': '部门名称不能超过50个字符',
        'any.required': '部门名称是必填项'
      }),
    
    name_en: Joi.string().min(2).max(50).allow('', null)
      .pattern(/^[A-Za-z0-9_\- ]+$/)
      .messages({
        'string.base': '部门英文名称必须是字符串',
        'string.min': '部门英文名称至少需要2个字符',
        'string.max': '部门英文名称不能超过50个字符',
        'string.pattern.base': '部门英文名称只能包含字母、数字、下划线、横线和空格'
      }),
    
    code: Joi.string().pattern(/^[A-Za-z0-9_-]+$/).min(2).max(50).required()
      .messages({
        'string.pattern.base': '部门编码只能包含字母、数字、下划线和横线',
        'string.empty': '部门编码不能为空',
        'string.min': '部门编码至少需要2个字符',
        'string.max': '部门编码不能超过50个字符',
        'any.required': '部门编码是必填项'
      }),
    
    parent_id: Joi.number().integer().min(1).allow(null)
      .messages({
        'number.base': '父部门ID必须是数字',
        'number.integer': '父部门ID必须是整数',
        'number.min': '父部门ID必须大于0'
      }),
    
    order_num: Joi.number().integer().min(0).default(0)
      .messages({
        'number.base': '显示顺序必须是数字',
        'number.integer': '显示顺序必须是整数',
        'number.min': '显示顺序不能小于0'
      }),

    leader_userid: Joi.string().max(50).allow('', null)
      .messages({
        'string.base': '部门负责人ID必须是字符串',
        'string.max': '部门负责人ID不能超过50个字符'
      }),
    
    leader: Joi.string().max(50).allow('', null)
      .messages({
        'string.base': '负责人必须是字符串',
        'string.max': '负责人不能超过50个字符'
      }),
    
    phone: Joi.string().pattern(/^1[3-9]\d{9}$/).allow('', null)
      .messages({
        'string.pattern.base': '请输入正确的手机号码'
      }),
    
    email: Joi.string().email().max(50).allow('', null)
      .messages({
        'string.email': '请输入正确的邮箱地址',
        'string.max': '邮箱不能超过50个字符'
      }),
    
    status: Joi.number().valid(0, 1).default(1)
      .messages({
        'number.base': '状态必须是数字',
        'any.only': '状态只能是0或1'
      }),

    source_type: Joi.string().valid('local', 'wework', 'dingtalk', 'feishu').default('local')
      .messages({
        'string.base': '部门来源必须是字符串',
        'any.only': '部门来源只能是local、wework、dingtalk或feishu'
      }),

    source_id: Joi.string().max(50).allow('', null)
      .messages({
        'string.base': '第三方部门ID必须是字符串',
        'string.max': '第三方部门ID不能超过50个字符'
      }),
    
    template_id: Joi.number().integer().min(1).allow(null)
      .messages({
        'number.base': '权限模板ID必须是数字',
        'number.integer': '权限模板ID必须是整数',
        'number.min': '权限模板ID必须大于0'
      }),
    
    rules: Joi.string().allow('', null),

    level: Joi.number().integer().min(1).required()
      .messages({
        'number.base': '部门层级必须是数字',
        'number.integer': '部门层级必须是整数',
        'number.min': '部门层级必须大于0',
        'any.required': '部门层级是必填项'
      })
  })

  return schema.validate(data, { abortEarly: false })
}

// 部门排序验证规则
exports.validateDepartmentOrder = (data) => {
  const orderSchema = Joi.object({
    id: Joi.number().integer().min(1).required()
      .messages({
        'number.base': '部门ID必须是数字',
        'number.integer': '部门ID必须是整数',
        'number.min': '部门ID必须大于0',
        'any.required': '部门ID是必填项'
      }),
    parent_id: Joi.number().integer().min(1).allow(null)
      .messages({
        'number.base': '父部门ID必须是数字',
        'number.integer': '父部门ID必须是整数',
        'number.min': '父部门ID必须大于0'
      }),
    order_num: Joi.number().integer().min(0).required()
      .messages({
        'number.base': '显示顺序必须是数字',
        'number.integer': '显示顺序必须是整数',
        'number.min': '显示顺序不能小于0',
        'any.required': '显示顺序是必填项'
      })
  })

  const schema = Joi.object({
    orders: Joi.array().items(orderSchema).min(1).required()
      .messages({
        'array.base': 'orders必须是数组',
        'array.min': 'orders至少需要一个元素',
        'any.required': 'orders是必填项'
      })
  })

  return schema.validate(data, { abortEarly: false })
}

// 权限模板验证规则
exports.validatePermissionTemplate = (data) => {
  const schema = Joi.object({
    name: Joi.string().min(2).max(50).required()
      .messages({
        'string.base': '模板名称必须是字符串',
        'string.empty': '模板名称不能为空',
        'string.min': '模板名称至少需要2个字符',
        'string.max': '模板名称不能超过50个字符',
        'any.required': '模板名称是必填项'
      }),

    code: Joi.string().pattern(/^[A-Za-z0-9_-]+$/).min(2).max(50).required()
      .messages({
        'string.pattern.base': '模板编码只能包含字母、数字、下划线和横线',
        'string.empty': '模板编码不能为空',
        'string.min': '模板编码至少需要2个字符',
        'string.max': '模板编码不能超过50个字符',
        'any.required': '模板编码是必填项'
      }),

    description: Joi.string().max(200).allow('', null)
      .messages({
        'string.base': '模板描述必须是字符串',
        'string.max': '模板描述不能超过200个字符'
      }),

    permissions: Joi.object({
      system: Joi.array().items(Joi.string()).required(),
      business: Joi.array().items(Joi.string()).required(),
      data: Joi.object({
        scope: Joi.string().valid('all', 'department', 'self').required(),
        fields: Joi.array().items(Joi.string()).required()
      }).required()
    }).required()
      .messages({
        'object.base': '权限配置必须是对象',
        'any.required': '权限配置是必填项'
      }),

    status: Joi.number().valid(0, 1).default(1)
      .messages({
        'number.base': '状态必须是数字',
        'any.only': '状态只能是0或1'
      })
  })

  return schema.validate(data, { abortEarly: false })
} 